"""
 1．类方法
   类方法是类所拥有的方法，须用修饰器“@classmethod”来标识。对于类方法，第一个参数必须是类对象，一般以cls作为第一个参数（同self一样只是一个习惯），可以通过对象名调用类方法，也可以通过类名调用类方法。
【例 6-8】   类方法示例。
【参考代码】
【程序说明】  上述代码中定义了一个Book类，在其中添加了类变量type，然后在类方法getType()中返回type的值。从运行结果可以看出，用对象名调用类方法和用类名调用类方法的效果是一样的。
【小提示】：类方法可以访问类变量，但无法访问实例变量。
"""

# class Book:  # 定义Book类
#     type = '课外书'  # 定义类变量并赋值
#
#     # 类方法，用classmethod进行修饰
#     @classmethod
#     def getType(cls):
#         return cls.type  # 返回类变量的值
#
#
# book = Book()  # 创建对象
# print(Book.getType())  # 通过类名调用类方法
# print(book.getType())  # 通过对象名调用类方法

"""
2．静态方法
   要在类中定义静态方法，须在方法前加上“@staticmethod”标记符，以表示下面的方法是静态方法。使用静态方法的好处是，不需要实例化对象即可调用该方法。
静态方法没有self参数，所以它无法访问类的实例变量；静态方法也没有cls参数，所以它也无法访问类变量。静态方法既可以通过对象名调用，也可以通过类名调用。
【例 6-9】   静态方法示例。
【参考代码】
【小技巧】：通过类的对象名可以调用实例方法、类方法和静态方法，通过类名可以调用类方法和静态方法。一般情况下，如果要修改实例变量的值，可直接使用实例方法；如果要修改类变量的值，可直接使用类方法；如果是辅助功能，如打印菜单等，则可以考虑使用静态方法。

"""


class Book:  # 定义Book类
    type = '课外书'  # 定义类变量并赋值

    # 静态方法，用@staticmethod进行修饰
    @staticmethod
    def printType():
        print('---书的类别---')


book = Book()  # 创建对象
book.printType()  # 通过对象名调用静态方法
Book.printType()  # 通过类名调用静态方法
print(book.type)  # 输出type
